// bzoj1109
// 题意：给定n(<=100000)个木块，从下往上叠，每个木块上都有个正整数ai。
//       如果木块正好是从下往上数第ai个位置的木块，那么就称其位置正确。
//       现在你可以随意拿走一些木块，问最后位置正确的木块数目最多是多少。
// 
// 题解：考虑最后留下来最多的一些木块。对于任意两个ai和aj，(i和j是在原来
//       位置的下标)。肯定有：
//       1. j > i
//       2. aj > ai
//       3. i - ai >= j - aj
//       第三条是我们可以这么理解，若设di=i-ai表示第i块木块想要移到正确
//       位置，下面还需要拿走多少木块，如果di是负数，直接跳过，因为不可能
//       再到正确位置。对于di和dj若j在i上面，肯定有dj >= di，若不然，我在
//       i下面移掉di个木块使i到了正确位置，但于此同时，dj就变成了负数，
//       永远不可能到正确位置。
//
//       但是这个问题是个三维偏序问题（需要cdq分治搞？）。
//
//       但是注意到，如果2和3同时成立，那么
//       j - i >= aj - ai > 0 故1也成立。
//
//       所以我们可以按照3来按二维偏序排序，然后求个lis就是答案。
//
// run: $exec < bfdiff.in
// opt: 0
// flag: -g
#include <iostream>
#include <utility>
#include <algorithm>
#include <vector>

int lis(std::vector<int> const & a)
{
	int ret = 0, n = a.size();
	std::vector<int> d(n + 2, 1 << 30);
	for (int i = 0; i < n; i++) {
		int k = std::lower_bound(d.begin() + 1, d.begin() + n + 1, a[i]) - d.begin();
		ret = std::max(ret, k);
		d[k] = std::min(d[k], a[i]);
	}
	return ret;
}

int main()
{
	std::ios::sync_with_stdio(false);
	int n; std::cin >> n;
	std::vector<std::pair<int, int> > a;
	for (int i = 1; i <= n; i++) {
		std::pair<int, int> tmp; std::cin >> tmp.second;
		if (i < tmp.second) continue;
		tmp.first = i - tmp.second;
		a.push_back(tmp);
	}
	std::sort(a.begin(), a.end());
	std::vector<int> b(a.size());
	for (int i = 0; i < (int)a.size(); i++) b[i] = a[i].second;
	std::cout << lis(b) << '\n';
}

